/*
 * (C) 2009, Elephant Seven Hamburg Gmbh, 
 * Author: Detlev Wiese
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy 
 * of the License at
 *  
 *     http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.se and its accompanying notice file is
 * included with the distribution. 
 */ 
package com.e7.streams;

import java.util.Enumeration;
import java.util.Iterator;

/**
 * <P>Abstract super-class for most Stream-classes: it provides 
 * implementations for: 
 * <ul> 
 * <li>{@link Enumeration#hasMoreElements()}</li>
 * <li>{@link Enumeration#nextElement()}</li>
 * <li>{@link Iterator#remove()}</li>
 * <li>{@link Iterable#iterator()}</li>
 * </ul>
 * </P>
 * @param <E> The type of the elements of the stream
 */
public abstract class AbstractStream<E> 
	implements Stream<E>, Iterator<E>, Enumeration<E> 
{
	public abstract boolean hasNext();
	public abstract E next();

	/**
	 * The receiver must not implement this method. Instead it 
	 * will throw 
	 * {@link java.lang.UnsupportedOperationException}.
	 */
	public final void remove() {
		throw new UnsupportedOperationException(); 
	}

	/**
	 * The receiver will return itself!
	 */
	public Iterator<E> iterator() {
		return this;
	}
	
	/**
	 * The receiver will return the result of {@link Stream#next()}.
	 */
	public E nextElement() { 
		return this.next();
	}
	
	/**
	 * The receiver will return the result of {@link Stream#hasNext()}.
	 */
	public boolean hasMoreElements() { 
		return this.hasNext();
	}
}
